package com.maibow.util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import sun.misc.BASE64Decoder;

/**
 * 上传文件
 * 脉博网络后台管理系统
 * 包名：com.maibow.util
 * 文件名：FileUpload.java
 * 作者: 吴比(Wubi)
 * 时间：2015年4月2日-上午9:13:45
 * Copyright@ 2015湖南脉博网络科技有限公司-版权所有
 *
 */
public class FileUpload {

    /**
     * @param file
     *            //文件对象
     * @param filePath
     *            //上传路径
     * @param fileName
     *            //文件名
     * @return 文件名
     */
    public static String fileUp(MultipartFile file, String filePath, String fileName) {
        String extName = ""; // 扩展名格式：
        try {
            if (file.getOriginalFilename().lastIndexOf(".") >= 0) {
                extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            }
            copyFile(file.getInputStream(), filePath, fileName + extName).replaceAll("-", "");
        } catch (IOException e) {
            System.out.println(e);
        }
        return fileName + extName;
    }

    public static String fileUpV2(String file, String filePath, String fileName) {
        String extName = ".png"; // 扩展名格式：
        try {

            BASE64Decoder decoder = new BASE64Decoder();
            // Base64解码
            byte[] b = decoder.decodeBuffer(file);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// 调整异常数据
                    b[i] += 256;
                }
            }
            InputStream inputStream = FileUpload.byte2Input(b);
            copyFile(inputStream, filePath, fileName + extName).replaceAll("-", "");
        } catch (IOException e) {
            System.out.println(e);
        }
        return fileName + extName;
    }

    public static InputStream fileUpV3(String file) {
        try {

            BASE64Decoder decoder = new BASE64Decoder();
            // Base64解码
            byte[] b = decoder.decodeBuffer(file);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// 调整异常数据
                    b[i] += 256;
                }
            }

            InputStream inputStream = new ByteArrayInputStream(b);
            return inputStream;
        } catch (IOException e) {
            System.out.println(e);
        }
        return null;
    }

    /**
     * 处理webp
     * processWebp 处理webp
     * (这里描述这个方法适用条件 – 可选)
     * 标记：@param inputStream
     * 标记：@param file2
     * 标记：@return
     * 返回值：File
     * 作者：吴比(Wubi)
     * 
     * @exception
     * @since 1.0.0
     */
    public static File processWebp(InputStream inputStream, String file2) {
        try {
            BufferedImage im = ImageIO.read(inputStream);
            File file = new File(file2);
            if (!file.exists()) {
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                file.createNewFile();
            }
            ImageIO.write(im, "webp", file);
            return file;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 
     * processPng(这里用一句话描述这个方法的作用)
     * (这里描述这个方法适用条件 – 可选)
     * 标记：@param inputStream
     * 标记：@param file2
     * 标记：@return
     * 返回值：File
     * 作者：吴比(Wubi)
     * 
     * @exception
     * @since 1.0.0
     */
    public static File processPng(InputStream inputStream, String file2) {
        try {
            BufferedImage im = ImageIO.read(inputStream);
            File file = new File(file2);
            if (!file.exists()) {
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                file.createNewFile();
            }
            ImageIO.write(im, "png", file);
            return file;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 
     * byte2Input(这里用一句话描述这个方法的作用)
     * (这里描述这个方法适用条件 – 可选)
     * 标记：@param buf
     * 标记：@return
     * 返回值：InputStream
     * 作者：吴比(Wubi)
     * 
     * @exception
     * @since 1.0.0
     */
    public static final InputStream byte2Input(byte[] buf) {
        return new ByteArrayInputStream(buf);
    }

    /**
     * 写文件到当前目录的upload目录中
     * 
     * @param in
     * @param fileName
     * @throws IOException
     */
    private static String copyFile(InputStream in, String dir, String realName) throws IOException {
        File file = new File(dir, realName);
        System.out.println("copy file before================= " + dir);
        if (!file.exists()) {
            System.out.println("copy file path not exist================= " + dir);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            file.createNewFile();
        }
        FileUtils.copyInputStreamToFile(in, file);
        return realName;
    }

    public static InputStream returnBitMap(String path) {
        URL url = null;
        InputStream is = null;
        try {
            url = new URL(path);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection对象,我们可以从网络中获取网页数据.
            conn.setDoInput(true);
            conn.connect();
            is = conn.getInputStream(); // 得到网络返回的输入流

        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }
}
